import { pathToBase64, base64ToPath } from 'image-tools'
import LogCat from '../js_sdk/AppLog/AppLog'
/**
 * 使用vite官方提供的方式，获取图片的路径
 *
 * @param {*} url
 * @returns {*}
 */
export const getViteImageUrl = url => {
  // #ifdef H5
  return new URL(`/src/static/images/${url}`, import.meta.url).href
  // #endif

  // #ifdef MP-WEIXIN || APP-ANDROID || APP-PLUS
  return `/static/images/${url}`
  // #endif
}

/**
 * 判断是否是外部链接
 *
 * @param {string} path
 * @returns {Boolean}
 */
export const isExternal = path => {
  return /^(https?:|http?:|mailto:|tel:)/.test(path)
}

/**
 * @description 随机获取uuid
 * @param {*} _
 * @returns
 */
export const getUuid = _ => {
  const s = []
  const hexDigits = '0123456789abcdef'
  for (let i = 0; i < 36; i++) {
    const nowIdx = Math.floor(Math.random() * 0x10)
    s[i] = hexDigits.slice(nowIdx, nowIdx + 1)
  }
  s[14] = '4'
  const idx2 = (s[19] & 0x3) | 0x8
  s[19] = hexDigits.slice(idx2, idx2 + 1)
  const uuid = s.join('')
  return uuid
}

/**
 * rpx转px单位计算
 * @param {*} rpx
 * @returns
 */
export const rpxToPx = rpx => {
  const systemInfo = uni.getSystemInfoSync()
  return rpx * (systemInfo.windowWidth / 750)
}

/**
 * @description toast消息弹窗提示
 * @param {string} text
 * @returns
 */
export const showToast = (text, type = 'none') => {
  uni.showToast({
    title: text,
    icon: type,
    duration: 2000,
    mask: true
  })
}

/**
 * 加载状态框
 * @param {*} title
 * @param {*} mask
 */
export const showLoading = (title = g_t('public.loading'), mask = true) => {
  uni.showLoading({
    title,
    mask
  })
}

/**
 * @description 动态计算获取可视区域的高度、底部高度
 * @param {string} text
 * @returns
 */
export const getPageNum = (isTitle, isTabbar) => {
  const systemInfo = uni.getSystemInfoSync()
  const statusBarHeight = systemInfo?.statusBarHeight || 0
  // 88rpx为标题栏高度
  const titleHeight = isTitle ? rpxToPx(58) + statusBarHeight : 0
  // 125rpx为底部导航栏高度，包括1rpx的边框
  const tabbarHeight = isTabbar ? rpxToPx(82) : 0

  return {
    titleHeight,
    tabbarHeight,
    height: systemInfo.windowHeight - titleHeight - tabbarHeight,
    bottom: systemInfo.windowBottom + tabbarHeight
  }
  // 其下的两种方法在APP-PLUS或H5都支持，在APP-NVUE不支持
  // return (
  //   uni.getSystemInfoSync().windowHeight -
  //   (isTabbar ? uni.rpx2px(128) : 0) +
  //   'px'
  // )
  // return `calc(${
  //   uni.getSystemInfoSync().windowHeight + 'px'
  // } - ${isTabbar ? '128rpx' : '0px'})`
}

/**
 * 获取 Android 设备当前 IP 地址
 * @param _ - 未使用的参数（通常用作占位符）
 * @returns {Promise<string>} 返回一个 Promise，解析为设备的本地 IP 地址或空字符串
 */
export const getLocalIpAddress = _ => {
  // 条件编译：仅在 H5、APP-PLUS 或 APP 平台下执行
  // #ifdef H5 || APP-PLUS || APP
  if (window.plus || typeof plus !== 'undefined') {
    // 判断是否运行在 HTML5+ 环境（如 App 的 Webview 中）
    return new Promise((resolve, reject) => {
      // 导入 Android 的 Context 类
      const Context = plus.android.importClass('android.content.Context')
      // 获取当前运行时的主 Activity
      const main = plus.android.runtimeMainActivity()
      // 获取连接服务（ConnectivityService）
      const cm = main.getSystemService(Context.CONNECTIVITY_SERVICE)
      plus.android.importClass(cm)

      // 获取当前活动的网络
      const network = cm.getActiveNetwork()
      // 如果没有活动的网络连接，则拒绝 Promise
      if (!network) {
        reject('')
        return true
      }

      // 获取网络链接属性
      const linkProperties = cm.getLinkProperties(network)
      // 获取所有链接地址
      let linkAddrs = plus.android.invoke(linkProperties, 'getLinkAddresses')
      plus.android.importClass(linkAddrs)

      // 遍历所有链接地址
      for (var i = 0; i < linkAddrs.size(); i++) {
        // 获取网络地址对象
        const inetAddr = plus.android.invoke(linkAddrs.get(i), 'getAddress')
        // 获取 IP 地址字符串
        const ip = plus.android.invoke(inetAddr, 'getHostAddress')

        // 过滤掉 IPv6 本地地址（::1）、链路本地地址（fe80）和本地回环地址（127.*）
        if (
          !ip.includes('::1') &&
          !ip.includes('fe80') &&
          !ip.startsWith('127.')
        ) {
          // 返回符合条件的第一个 IP 地址
          resolve(ip)
          return true
        }
      }
    })
  } else {
    // 如果不在 HTML5+ 环境（如普通浏览器中），返回空字符串
    return Promise.resolve('')
  }
  // #endif
}

/**
 * @description 检测APP是否需要升级
 * @param {*} _
 * @returns
 */
export const checkUpdate = _ => {
  return new Promise(resolve => {
    // #ifdef H5
    const versionCode = uni.getSystemInfoSync().appVersionCode * 1
    resolve(versionCode)
    // #endif

    // #ifdef APP-PLUS || APP
    plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
      const versionCode = widgetInfo.versionCode * 1
      resolve(versionCode)
    })
    // #endif
  })
}

/**
 * @description 本地临时文件转图片base64
 * @param {*} tempfile
 * @returns
 */
export const tempfileToBase64 = tempfile => {
  return new Promise((resolve, reject) => {
    // 读取文件内容并转Base64
    pathToBase64(tempfile)
      .then(base64 => {
        // console.log(base64)
        resolve(base64)
      })
      .catch(error => {
        // console.error(error)
        reject(new Error('转换base64失败'))
      })
  })
}

/**
 * @description 获取图片base64
 * @param {*} url
 * @returns
 */
export const urlToBase64 = url => {
  return new Promise((resolve, reject) => {
    // 1. 下载图片到本地临时路径
    uni.downloadFile({
      url: url,
      timeout: 10 * 1000,
      success: res => {
        if (res.statusCode === 200) {
          // 2. 读取文件内容并转Base64
          tempfileToBase64(res.tempFilePath)
            .then(base64 => {
              // console.log(base64)
              resolve(base64)
            })
            .catch(err => {
              // console.error(error)
              reject(error)
            })
        } else {
          reject(new Error('下载失败'))
        }
      },
      fail: downloadErr => reject(downloadErr)
    })
  })
}

/**
 * 赋值数据到表单数据中
 * @param {Object} formData
 * @param {Object} data
 */
export const assignFormData = (formData, data) => {
  Object.keys(formData).forEach(k => {
    if (g_.isArray(data[k]) || g_.isObject(data[k])) {
      formData[k] = data[k]
    } else if (data[k] || data[k] === 0) {
      formData[k] = data[k]
    }
  })
}

/**
 * @description 获取appId,实际为系统的deviceId
 * @param {*} _
 */
export const getAppId = _ => {
  return uni.getSystemInfoSync().deviceId
}

/**
 * 重写console.log方法
 * 保持原始功能同时写入日志文件
 */
export const writeLog = function (...args) {
  console.log(...args) // 保持原始控制台输出
  // #ifdef APP-PLUS
  LogCat.writeAsyncLog(...args) // 写入文件
  // #endif
}
